package br.com.beautycenter.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;

@Entity
@Table(name = "Cliente")
public class Cliente extends Pessoa {
    
    @Column(name="PROFISSAO")
    private String profissao;
    
    @Column(name="FILHOS")
    private boolean filhos;
    
    @Column(name="QTD_FILHOS")
    private int qtdFilhos;
    
    @Column(name="MEDICO_RESPONSAVEL")
    private String medicoResponsavel;
    
    @Column(name="DT_AVALIACAO")
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dtAvaliacao;
    
    @Column(name="QUEIXA_PRINCIPAL")
    private String queixaPrincipal;
    
    @Lob @Basic(fetch=FetchType.LAZY)
    @Column(name = "FOTO",length=16777215)  
    private byte[] foto;
    
    @Column(name="CREDITO", scale=2)
    private double credito = 0;
        
    //relacionamento paciente 1-N pacotes de tratamento
    @OneToMany(mappedBy="cliente", cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY)
    private List<PacoteTratamento> listaPacotesTratamento;
    
    //relacionamento paciente 1-N perfil antropometrico
    @OneToMany(mappedBy="cliente", cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY)
    private List<PerfilAntropometrico> listaPerfisAntropometricos;
    
    //relacionamento paciente 1-N exame físico
    @OneToMany(mappedBy="cliente", cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY)
    private List<ExameFisico> listaExamesFisicos;
    
    //relacionamento paciente 1-N exame físico
    @OneToMany(mappedBy="cliente", cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY)
    private List<ContraIndicacao> listaContraIndicacoes;
    
    @OneToMany(mappedBy="cliente", cascade= CascadeType.ALL, orphanRemoval=true, fetch= FetchType.LAZY)
    private List<Digital> listaDigitais;
    
    @ManyToOne
    @JoinColumn(name="ID_AGENDA", referencedColumnName="ID_AGENDA")
    private Agenda agenda;
    
    @Column(name="INDICACAO")
    private String indicacao;
    
    /**
     * @return the profissao
     */
    public String getProfissao() {
        return profissao;
    }

    /**
     * @param profissao the profissao to set
     */
    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    /**
     * @return the filhos
     */
    public boolean isFilhos() {
        return filhos;
    }

    /**
     * @param filhos the filhos to set
     */
    public void setFilhos(boolean filhos) {
        this.filhos = filhos;
    }

    /**
     * @return the qtdFilhos
     */
    public int getQtdFilhos() {
        return qtdFilhos;
    }

    /**
     * @param qtdFilhos the qtdFilhos to set
     */
    public void setQtdFilhos(int qtdFilhos) {
        this.qtdFilhos = qtdFilhos;
    }

    /**
     * @return the medicoResponsavel
     */
    public String getMedicoResponsavel() {
        return medicoResponsavel;
    }

    /**
     * @param medicoResponsavel the medicoResponsavel to set
     */
    public void setMedicoResponsavel(String medicoResponsavel) {
        this.medicoResponsavel = medicoResponsavel;
    }

    /**
     * @return the dtAvaliacao
     */
    public Date getDtAvaliacao() {
        return dtAvaliacao;
    }

    /**
     * @param dtAvaliacao the dtAvaliacao to set
     */
    public void setDtAvaliacao(Date dtAvaliacao) {
        this.dtAvaliacao = dtAvaliacao;
    }

    /**
     * @return the queixaPrincipal
     */
    public String getQueixaPrincipal() {
        return queixaPrincipal;
    }

    /**
     * @param queixaPrincipal the queixaPrincipal to set
     */
    public void setQueixaPrincipal(String queixaPrincipal) {
        this.queixaPrincipal = queixaPrincipal;
    }


    public List<PacoteTratamento> getListaPacotesTratamento() {
        return listaPacotesTratamento;
    }
    
    public List<PacoteTratamento> getListaPacotesTratamento(int tipo) {
        List<PacoteTratamento> lista = new ArrayList<PacoteTratamento>();
        if(listaPacotesTratamento == null) return lista;
        
        for(PacoteTratamento item: listaPacotesTratamento){
            if(item.getTipoPacote() == tipo){
                lista.add(item);
            }
        }
        
        return lista;
        
        
    }
    
    

    public List<PerfilAntropometrico> getListaPerfisAntropometricos() {
        return listaPerfisAntropometricos;
    }

    public List<ExameFisico> getListaExamesFisicos() {
        return listaExamesFisicos;
    }

    public Agenda getAgenda() {
        return agenda;
    }

    public void setAgenda(Agenda agenda) {
        this.agenda = agenda;
    }

    public List<Digital> getListaDigitais() {
        return listaDigitais;
    }

    public void setListaDigitais(List<Digital> listaDigitais) {
        this.listaDigitais = listaDigitais;
    }

    public void setListaPacotesTratamento(List<PacoteTratamento> listaPacotesTratamento) {
        this.listaPacotesTratamento = listaPacotesTratamento;
    }

    public void setListaPerfisAntropometricos(List<PerfilAntropometrico> listaPerfisAntropometricos) {
        this.listaPerfisAntropometricos = listaPerfisAntropometricos;
    }

    public void setListaExamesFisicos(List<ExameFisico> listaExamesFisicos) {
        this.listaExamesFisicos = listaExamesFisicos;
    }

    public List<ContraIndicacao> getListaContraIndicacoes() {
        return listaContraIndicacoes;
    }

    public void setListaContraIndicacoes(List<ContraIndicacao> listaContraIndicacoes) {
        this.listaContraIndicacoes = listaContraIndicacoes;
    }

    /**
     * @return the foto
     */
    public byte[] getFoto() {
        return foto;
    }

    /**
     * @param foto the foto to set
     */
    public void setFoto(byte[] foto) {
        this.foto = foto;
    }

    public double getCredito() {
        return credito;
    }

    public void setCredito(double credito) {
        this.credito = credito;
    }

    /**
     * @return the indicacao
     */
    public String getIndicacao() {
        return indicacao;
    }

    /**
     * @param indicacao the indicacao to set
     */
    public void setIndicacao(String indicacao) {
        this.indicacao = indicacao;
    }
}
